from fastapi import APIRouter, Path, Body
import typing as T
from ..dto.Result import Result
from ..dto.Dept import Dept
from ..service.imp.DeptsServiceImp import DeptService


router = APIRouter(prefix="/depts", tags=["部门管理相关接口"])


@router.get("", response_model=Result)
async def list(deptService: DeptService):
    """
    # 查询所有部门接口

    ## 接口描述
    该接口用于查询系统中所有的部门信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: GET
    - **路径**: `/depts`

    ## 参数说明
    - 无

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，包含查询到的部门信息列表。
    """
    result = Result.success(await deptService.list())
    return result


@router.delete("/{id}", response_model=Result)
async def delete(id: T.Annotated[int, Path()], deptService: DeptService):
    """
    # 根据ID删除部门接口

    ## 接口描述
    该接口用于根据部门ID删除指定部门，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: DELETE
    - **路径**: `/depts/{id}`

    ## 参数说明
    - **id**:
      - 类型: `int`
      - 描述: 部门ID，标识需要删除的部门。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await deptService.delete(id)
    return Result.success()


@router.post("", response_model=Result)
async def save(
    dept: T.Annotated[Dept, Body(description="部门名称")], deptService: DeptService
):
    """
    # 保存部门接口

    ## 接口描述
    该接口用于保存部门信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: POST
    - **路径**: `/depts`

    ## 参数说明
    - **dept**:
      - 类型: [`Dept`](file://app/dto/Dept.py)
      - 描述: 部门信息，包含需要保存的部门名称等字段。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await deptService.save(dept)
    return Result.success()


@router.get("/{id}", response_model=Result)
async def getById(id: T.Annotated[int, Path()], deptService: DeptService):
    """
    # 根据ID查询部门接口

    ## 接口描述
    该接口用于根据部门ID查询指定部门信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: GET
    - **路径**: `/depts/{id}`

    ## 参数说明
    - **id**:
      - 类型: `int`
      - 描述: 部门ID，标识需要查询的部门。
    - **deptService**:
      - 类型: [`DeptService`](file://app/service/DeptService.py)
      - 描述: 部门服务类，负责提供部门相关的业务逻辑。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，包含查询到的部门信息。
    """
    return Result.success(await deptService.getById(id))


@router.put("", response_model=Result)
async def update(
    dept: T.Annotated[Dept, Body(description="部门信息")], deptService: DeptService
):
    """
    # 更新部门接口

    ## 接口描述
    该接口用于更新部门信息，并返回一个标准化的`Result`对象。

    ## 请求方法
    - **HTTP方法**: PUT
    - **路径**: `/depts`

    ## 参数说明
    - **dept**:
      - 类型: [`Dept`](file://app/dto/Dept.py)
      - 描述: 部门信息，包含需要更新的部门名称等字段。
    - **deptService**:
      - 类型: [`DeptService`](file://app/service/DeptService.py)
      - 描述: 部门服务类，负责提供部门相关的业务逻辑。

    ## 返回值
    - **类型**: [`Result`](file://app/dto/Result.py)
    - **字段说明**:
      - `code`: 状态码，表示请求的结果状态。
      - `msg`: 消息，描述请求的结果。
      - `data`: 数据，默认为`None`。

    ## 示例返回值
    ```json
    {
      "code": 1,
      "msg": "success",
      "data": null
    }
    """
    await deptService.update(dept)
    return Result.success()
